package com.taxsearch.util.payuntil;

import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import org.apache.commons.codec.digest.DigestUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class MD5 {

	public static String md5(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(str.getBytes());
			byte b[] = md.digest();

			int i;

			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			str = buf.toString();
		} catch (Exception e) {
			e.printStackTrace();

		}
		return str;
	}
	

	    /**
	     * 签名字符串
	     * @param text 需要签名的字符串
	     * @param key 密钥
	     * @param input_charset 编码格式
	     * @return 签名结果
	     */
	    public static String sign(String text, String key, String input_charset) {
	    	text = text + key;
	        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
	    }
	    
	    /**
	     * 签名字符串
	     * @param text 需要签名的字符串
	     * @param sign 签名结果
	     * @param key 密钥
	     * @param input_charset 编码格式
	     * @return 签名结果
	     */
	    public static boolean verify(String text, String sign, String key, String input_charset) {
	    	text = text + key;
	    	String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
	        return mysign.equals(sign);
	    }
	    /**
	     * 验签威富通返回的xml
	     * @return
	     */
	    public static boolean verifyWftXml(String xml,  String key, String input_charset){
	    	boolean r=false;
	    	try{
				SAXReader saxreader=new SAXReader();
				Document doc= saxreader.read(new StringReader(xml));
				String sign=doc.getRootElement().element("sign").getText();
				 Node node = doc.getRootElement().selectSingleNode("sign");
				 doc.getRootElement().remove(node);
				 List<Element> l=doc.getRootElement().elements();
				 String[] num=new String[l.size()];
				    for(int i=0;i<l.size();i++){
				        num[i]=l.get(i).getName();
				    }  
				    Arrays.sort(num);
				    String s="";
					for(int i=0;i<num.length;i++){
						if(i==0){
						s=s+num[i]+"="+doc.getRootElement().element(num[i]).getText();
						}else{
						s=s+"&"+num[i]+"="+doc.getRootElement().element(num[i]).getText();
						}
					}
					s = s +"&key="+ key;
			    	String mysign = DigestUtils.md5Hex(getContentBytes(s, input_charset));
			        r= mysign.toUpperCase().equals(sign);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			return r;
		}
	    	
	    }

	    /**
	     * @param content
	     * @param charset
	     * @return
	     * @throws java.security.SignatureException
	     * @throws UnsupportedEncodingException
	     */
	    private static byte[] getContentBytes(String content, String charset) {
	        if (charset == null || "".equals(charset)) {
	            return content.getBytes();
	        }
	        try {
	            return content.getBytes(charset);
	        } catch (UnsupportedEncodingException e) {
	            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
	        }
	    }
	    

}
